home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / batch / library / batutl2 / task.asm < prev    next >
Assembly Source File  |  1988-04-20  |  7KB  |  262 lines

  1. TITLE    TASK    12-6-85    [4-18-88]
  2. ;Toad Hall Disassembly, tweak
  3.  
  4. LF    EQU    0AH
  5. CR    EQU    0DH
  6. ;
  7. ;INITIAL VALUES :    CS:IP    0000:0100
  8. ;            SS:SP    0000:FFFF
  9. CodeSeg    SEGMENT
  10.     ASSUME DS:CodeSeg,SS:CodeSeg,CS:CodeSeg,ES:CodeSeg
  11.     ORG    100H
  12.  
  13. Task    proc    near
  14.     JMP    Start
  15.  
  16. usageMsg DB    'TASK; Version 1.33, created on 04/20/88 at 18:00:00',CR,LF
  17.     DB    '(C) COPYRIGHT 1985 by System Enhancement Associates; '
  18.     DB    'ALL RIGHTS RESERVED',CR,LF
  19.     db    '(Toad Hall Tweak)',CR,LF,LF
  20.     DB    'Timed ASK for batch files.  Error level 0=Yes, 1=No,'
  21.     db    ' 2=No answer',CR,LF,LF
  22.     DB    'Usage: task [<n>] [<q>]',CR,LF
  23.     DB    'Where:   <n> = Time limit in seconds (default 20)',CR,LF
  24.     DB    '         <q> = Question to ask',CR,LF,'$'
  25.  
  26. promptStr    DB    '(Y or N) $'
  27. noStr        DB    'No',CR,LF,'$'
  28. yesStr        DB    'Yes',CR,LF,'$'
  29. noAnswerStr    DB    ' (no answer given)',CR,LF,'$'
  30.  
  31. day_25D        DB    0
  32. hour_25E    DB    0
  33. minute_25F    DB    0
  34. second_260    DB    0
  35. decisec_261    DB    0
  36. bflag_262    DB    0
  37. second_263    DB    0
  38. word_264    dw    0
  39. Task    endp
  40.  
  41.  
  42. ;Convert time (in CX and DX) to seconds,
  43. ;return in AX
  44. Time_To_Seconds    proc    near
  45.     MOV    DL,DH        ;seconds
  46.     XOR    DH,DH        ;clear msb
  47.     PUSH    DX        ;save
  48.     MOV    DL,CL        ;minutes
  49.     PUSH    DX        ;save
  50.     XOR    AH,AH        ;clear msb
  51.     MOV    AL,CH        ;hours
  52.     MOV    DX,3CH        ;*60
  53.     MUL    DX
  54.     POP    DX        ;restore minutes
  55.     ADD    AX,DX        ;add to hours in minutes
  56.     MOV    DX,3CH        ;*60
  57.     MUL    DX        ;produces hours + minutes in seconds
  58.     POP    DX        ;restore seconds
  59.     ADD    AX,DX        ;accum hours + minutes + seconds
  60.     RET
  61. Time_To_Seconds    endp
  62.  
  63. Compare_Time    proc    near
  64.     CMP    DH,second_263        ;compare now with start seconds
  65.     JZ    Ret2AC            ;same
  66.     MOV    second_263,DH        ;save as start seconds
  67.     CALL    Time_To_Seconds        ;convert time to seconds
  68.     MOV    DX,word_264        ;start time
  69.     SUB    DX,AX            ;minus now in seconds
  70.     CMP    DX,9            ;timed out?
  71.     JG    Ret2AC            ;exit, carry set
  72.     CMP    DX,0            ;timed out?
  73.     JLE    Ret2AC            ;exit, carry, zflag set
  74.     MOV    AH,2            ;display char
  75.     add    dl,30H            ;asciify char in DL
  76.     INT    21H
  77.     mov    dl,8            ;display Ctrl H, backspace
  78.     INT    21H
  79. Ret2AC:    RET
  80. Compare_Time    endp
  81.  
  82.  
  83. ;Dumb, cleaned this up below.
  84. ;Show_Usage    proc    near
  85. ;    MOV    DX,OFFSET usageMsg    ;usage message'
  86. ;    MOV    AH,9
  87. ;    INT    21H
  88. ;    RET
  89. ;Show_Usage    endp
  90.  
  91.  
  92. Start    proc    near
  93.     MOV    AX,2523H        ;Set new int 23H vector
  94.     MOV    DX,OFFSET Die_3F2    ;to our process
  95.     INT    21H
  96.     MOV    AH,2CH            ;get current system time
  97.     INT    21H
  98.     MOV    day_25D,AL        ;day of week
  99.     MOV    hour_25E,CH        ;current hour
  100.     MOV    minute_25F,CL        ; minute
  101.     MOV    second_260,DH        ; second
  102.     MOV    decisec_261,DL        ; decisecond
  103.     XOR    CH,CH            ;clear msb
  104.     MOV    CL,DS:80H        ;DOS PSP cmd line length byte
  105.     CMP    CX,1            ;1 char or less?
  106.     ja    Cmd_Ok            ; long enough maybe,continue
  107.       mov    dx,offset usageMsg    ;explain how
  108.       jmp    Die_0            ;display, terminate
  109.  
  110. Cmd_Ok:
  111.     MOV    DI,81H            ;point to first char on cmd line
  112.     CLD                ;insure fwd
  113.     MOV    AL,20H            ;scan for a space
  114.     REPZ    SCASB
  115.     DEC    DI            ;back up to actual cmd line start
  116.     INC    CX            ;adjust where the space is
  117.     XOR    AX,AX            ;clear ax
  118.     xor    bx,bx            ;clear msb
  119. CmdLine_Loop:
  120.     JCXZ    L0309            ;cx is zeroed out, skip
  121.     MOV    BL,[DI]            ;snarf cmd line char
  122.     CMP    BL,'0'            ;legal digit?
  123.     JL    L0309            ; nope, less
  124.     CMP    BL,'9'            ;legal digit?
  125.     JG    L0309            ; nope, greater
  126.     SUB    BL,30H            ;deasciify
  127.     MOV    DX,0AH            ;multiplier
  128.     MUL    DX            ;ax *10
  129.     ADD    AX,BX            ;add in the 1's digit
  130.     DEC    CX            ;decrement cmd line char counter
  131.     INC    DI            ;bump cmd line char pointer
  132.     JMP    SHORT    CmdLine_Loop    ; and reloop
  133.  
  134. L0309:    PUSH    AX            ;save decimal time value a sec
  135.     MOV    AL,' '            ;scan for a space
  136.     REPZ    SCASB
  137.     MOV    BX,CX            ;use as offset
  138.     MOV    BYTE PTR [BX+DI],'$'    ;terminate cmd line as a string
  139.     DEC    DI            ;adjust pointer
  140.     POP    AX            ;restore
  141.     or    ax,ax            ;zero time delay?
  142.     JNZ    L031D            ; nope, got some sort of delay
  143.      MOV    AX,14H            ;force to 20 seconds minimum
  144. L031D:    ADD    AL,second_260        ;add in start second
  145.     XOR    BX,BX            ;clear msb
  146.     MOV    BL,minute_25F        ;start minute
  147.     XOR    CX,CX            ;clear msb
  148.     MOV    CL,hour_25E        ;start hour
  149.     XOR    DX,DX            ;clear msb
  150.     MOV    DL,day_25D        ;start day
  151. Lup333:    CMP    AX,3CH            ;target seconds <60?
  152.     JL    Lup33E            ; ok, legal
  153.      SUB    AX,3CH            ;adjust seconds (-60)
  154.      INC    BX            ;bump target minutes
  155.      JMP    SHORT    Lup333        ; and reloop
  156.  
  157. Lup33E:    CMP    BX,3CH            ;target minutes <60?
  158.     JL    Lup349            ; ok, legal
  159.      SUB    BX,3CH            ;adjust minutes (-60)
  160.      INC    CX            ;bump target hours
  161.      JMP    SHORT    Lup33E        ; and reloop
  162.  
  163. Lup349:    CMP    CX,18H            ;target hours <24?
  164.     JL    Lup354            ; ok, legal
  165.      SUB    CX,18H            ;adjust -24
  166.      INC    DX            ;bump target days
  167.      JMP    SHORT    Lup349        ; and reloop
  168.  
  169. Lup354:    CMP    DX,7            ;target days <7? (max delay is 1 week)
  170.     JL    L035E            ; ok, legal
  171.      SUB    DX,7            ;adjust target day (-7)
  172.      JMP    SHORT    Lup354        ; and reloop
  173.  
  174. L035E:    MOV    second_260,AL        ;save target seconds to go
  175.     MOV    minute_25F,BL        ; and minutes
  176.     MOV    hour_25E,CL        ; and hours
  177.     MOV    day_25D,DL        ; and days
  178.     MOV    CH,CL            ;move hours to CH
  179.     MOV    CL,BL            ; move minutes to CL
  180.     MOV    DH,AL            ; move seconds to DH
  181.     CALL    Time_To_Seconds        ;convert time to seconds
  182.     MOV    word_264,AX        ;and save here
  183.     MOV    DX,DI            ;question to ask (from cmd line)
  184.     MOV    AH,9            ;display question
  185.     INT    21H
  186.     MOV    AH,2            ;output char
  187.     MOV    DL,' '            ; a space
  188.     INT    21H
  189. ;Now we wait for the user to respond (up to a week!)
  190. TimeLoop:
  191.     MOV    AH,0BH            ;check kbd status
  192.     INT    21H
  193.     or    al,al            ;anything there?
  194.     JZ    L03BC            ; Nope
  195.     MOV    AH,8            ; yep, read the kbd
  196.     INT    21H            ;(response in AL)
  197.     CMP    AL,CR            ;did he answer w/just RETURN?
  198.     JZ    Die_NoAnswer        ; yep, die with "No answer"
  199.     CMP    AL,1BH            ;did he answer w/escape char?
  200.     JZ    Die_NoAnswer        ; yep, die with "No answer"
  201.     AND    AL,5FH            ;uppercase response
  202.     CMP    AL,'Y'            ;did he answer Yes?
  203.     JZ    DieYes            ; yep, exit
  204.     CMP    AL,'N'            ;did he answer No?
  205.     JZ    DieNo            ; yep, exit
  206.  
  207.     MOV    DL,7            ;bell
  208.     MOV    AH,2            ;display char
  209.     INT    21H
  210.  
  211.     CMP    BYTE PTR bflag_262,0    ;have we prompted yet?
  212.     JNZ    L03BC            ; yep, skip the prompt
  213.      MOV    DX,OFFSET promptStr    ;'Y or N' prompt
  214.      mov    ah,9            ;display string
  215.      INT    21H
  216.      MOV    BYTE PTR bflag_262,1    ;flag we've prompted
  217.  
  218. L03BC:    MOV    AH,2CH            ;get system time
  219.     INT    21H
  220.     CMP    AL,day_25D        ;target day?
  221.     JG    Die_NoAnswer        ; timed out, die
  222.     JL    L03E6            ; less, passed thru Sunday, go recalc
  223.     CMP    CH,hour_25E        ;compare now with start hour
  224.     JG    Die_NoAnswer        ; greater, timed out, exit
  225.     JL    L03E6            ; less, past midnight, go recalc
  226.     CMP    CL,minute_25F        ;compare now with start minute
  227.     JG    Die_NoAnswer        ; greater, timed out, exit
  228.     JL    L03E6            ; less, went to new hour, go recalc
  229.     CMP    DH,second_260        ;compare now with start second
  230.     JG    Die_NoAnswer        ; greater, timed out, exit
  231.     JL    L03E6            ; less, went to new minute
  232.     CMP    DL,decisec_261        ;compare now with start decisecond
  233.     JG    Die_NoAnswer        ; greater, timed out, exit
  234. L03E6:    CALL    Compare_Time        ;check time, display counter
  235.     JMP    SHORT    TimeLoop
  236.  
  237. DieNo:    MOV    DX,OFFSET noStr        ;'No'
  238.     MOV    AH,9            ;display string
  239.     INT    21H
  240. Die_3F2:
  241.     mov    ax,4C01H        ;Terminate, Errorlevel 1
  242.     INT    21H
  243.  
  244. DieYes:    MOV    DX,OFFSET yesStr    ;'Yes'
  245. ;enter here with string ofs in dx
  246. Die_0:                    ;enter here with String ofs in DX
  247.     MOV    AH,9            ;display string
  248.     INT    21H
  249.     mov    ax,4C00H        ;Terminate, Errorlevel 0
  250.     INT    21H
  251.  
  252. Die_NoAnswer:
  253.     MOV    DX,OFFSET noAnswerStr    ;'No answer given'
  254.     MOV    AH,9
  255.     INT    21H
  256.     mov    ax,4C02H        ;Terminate, Errorlevel 2
  257.     INT    21H
  258. Start    endp
  259.  
  260. CodeSeg    ENDS
  261.     END    Task
  262.